系统与共识

6.1 概述

本系统采用Akka-Actor做为模块实现基本组件,实现了系统创建、初始化、运行,进行全网共识并出块。 同时,对沙箱预执行模块和存储模块调用,完成整体的区块链系统功能。 主要分为系统创建及初始化、系统应用模块构建、区块数据同步、共识出块四大部分。

6.1.1系统创建及初始化

系统创建过程为:

  1. 根据需求创建单机单实例RepChain_Single,或者单机多实例RepChain。
  2. 根据1的需求创建指定数量的ClusterSystem实例。
  3. 通过ClusterSystem实例按照配置创建需要的API模块实例、分析统计模块实例、组网模块实例和应用模块管理实例。
  4. 应用模块继续构建各应用组件。

6.1.2 系统应用模型构建

  1. 负责系统安全相关的信任证书初始化、存储相关初始化、系统执行用各参数加载、系统用时间策略各参数加载。
  2. 创建各应用组件:持久化模块、同步模块、交易缓冲池、共识管理和辅助模块。

6.1.3区块数据同步

  1. 系统入网稳定后,进行区块链数据同步。
  2. 先同步,再交易。

6.1.4 共识

  1. 初始化共识配置。
  2. 构建共识模块。包括块模块、背书模块、合约容器、预执行模块和投票模块的构建。
  3. 初始化共识模块。
  4. 实现共识,保证系统正常出块并运行流畅。

6.2 系统与共识结构图

系统类的设计考虑到整体对Akka中Actor、Cluster的应用,以及针对一些功能进行拆分和抽象。设计了如下类关系,关系图如下所示。

(1)基础:

BaseActor: 继承Actor。主要负责actor地址、定时器的维护。

ClusterActor: 继承Actor。实现了与组网相关的基础功能,维护了订阅相关的实例。同时实现了actor在网络中的一些属性功能接口。

(2)日志:

RepLoging: 维护了log相关的实例,同时实现log相关的接口-包括记录log信息和操作时间戳。

(3)模块:

ModuleHelper: 继承Actor。维护了System级的共享变量接口(Extension),同时实现了模块相关的功能,维护了Actor注册的接口。

ModuleBase: 继承了ModuleHelper、ClusterActor、BaseActor和RepLogging。维护了日志相关的基础信息,同时重写了log相关的接口。作为系统功能模块的基础类。

(4)系统应用:

MemberListener: 继承ModuleHelper、RepLoging和ClusterActor,实现Akka分布式网络组网相关功能,包括入网、离网以及稳定节点整理。

StatisticCollection: 继承RepLogging,实现统计分析相关的功能。目前针对个操作时间、交易TPS进行了统计、分析和记录。

(5)共识:

BaseConsenter: 共识类的接口。主要定义了共识类的公共方法。

CRFD: 继承BaseConsenter。维护共识需要的模块。对其进行管理,例如创建、初始化和调用等。是共识部分的主要管理类。

系统与共识结构图

各模块均继承ModuleBase,分别实现了各自的模块所需功能,关系如下图所示:

ModuleManager: 主要负责应用模块的创建和初始化。同时作为各System节点间下层模块交互的信息中转。

BlockModule: 块模块。负责进行交易打包(预出块)、块预执行提交、块预执行结果处理、块背书结果处理、新块入网、接收新块等功能。

EndorsementModule: 背书模块。负责对块内数据(交易及其结果)进行校验和背书。

PreloadTransactionModule: 预执行模块。负责对块内交易进行整理并向合约提交预执行申请,同时整理预执行结果并反馈。

PersistenceModule: 存储模块。负责对块数据进行持久化。与存储层进行交互。

SyncModule: 同步模块。针对本节点的存储(链数据)状态,和全网状态进行同步,并获得相关数据以及同步结果反馈。

CRFDVoterModule: CRFD共识的投票模块。实现了CRFD共识算法的投票功能。

PeerHelper: 辅助模块。现阶段主要负责自动构建交易对系统进行模拟测试。

ClusterSystem: 主要负责系统初始化(配置信息加载)、创建系统实例,并根据配置加入区块链分布式网络;按需构建API实例;启动RepChain系统并实例化各上层功能模块。

SystemProfile: 加载系统用相关参数数据(从配置中加载)

TimePolicy: 加载系统时间策略用相关参数数据(从配置中加载)

ConsensusManager: 共识管理类。根据配置构建共识模块并进行初始化。

ConfigerHelper: 各模块初始化实现接口,安全、存储、系统和时间策略参数的初始化和加载。

ActorRegister: actor引用的注册中心。主要为了在系统内部获得actor引用,进行消息传输。

ClusterHelper: 实现akka和RepChain分布式网络相关的接口实现。

BlockerHelper: 实现与区块相关的辅助功能接口实现。

PeerExtension: 系统System的共享内存实现。

6.3 系统与共识流程

该节主要详细介绍系统创建运行和共识相关的流程,如下图所示。

1) 根据配置和系统构建方式,构建clusterSystem实例。

  1. 初始化系统及应用配置信息。主要针对配置文件整合。
  2. 根据需求加入分布式集群网络。
  3. 根据需求开启API接口模块。
  4. 启动RepChain系统
  5. 启动EventServer
  6. 启动StatisticCollection
  7. 启动MemberListener。
  8. 启动ModuleManager,系统模块管理。

2) 系统应用模块启动。

  1. 进行初始化

    • 信任证书初始化: 主要是读取节点自己的证书以及系统信任证书的数据,并载入系统。
    • 存储初始化: 实例化基于该System的存储实例。
    • 系统和时间策略初始化: 根据配置信息,将参数数据载入内存。
  2. 加载模块

    • PersistenceModule
    • SyncModule
    • TransactionPool
    • ConsensusManager
    • PeerHelper

    加载之后直接运行。

  3. 监听消息/事件

开启Actor消息监听

  • 存储模块的数据同步请求,向出块人节点请求同步数据。
  • 同步请求。收到其他节点的同步请求消息,将请求转至同步模块。
  • 节点(自身)入网成功和共识初始化完成,改变状态,都成功则通知sync进行同步。

3) 交易缓冲池TransactionPool启动

  1. 订阅交易。
  2. 接收API或者内部辅助类生成的交易,验证并加入缓存中。按需触发重新投票条件检查的请求。想投票节点发送消息。

4) PeerHelper启动

  1. 通过对本地合约文件的读取,生成模拟的交易,广播到网络中,以便测试用。

5) PersistenceModule启动

  1. 接收存储块,验证通过后进行存储。块存储一定是按照顺序的,如果出现丢块的现象,达到一定条件后向出块人请求该高度的块数据(该信息通过ModuleManager进行中转)。

6) SyncModule启动

  1. 接收同步启动的消息。

  2. 向全网广播同步请求,获取各节点链信息。

  3. 接收各节点链信息,进行整理。将同步需求和结果发送至BlockModule

    1. 只有自己,则为种子节点。
    2. 与在网大多数节点数据相同,则直接开始投票。
    3. 与在网大多数节点数据不相同,则向其中任意节点按需索要数据。
  4. 接收同步数据请求,打包数据(多块或者单块)向索要人发送数据。同时在最后一个块传输中添加同步完成标识。

  5. 接收同步数据,并发送数据到存储模块。

  6. 接受同步完成标识,反馈同步状态。

  7. 同步超时。

    1. 如果未同步成功,则重新同步申请
    2. 同步成功则反馈同步状态

7) ConsensusManager启动

  1. 初始化共识。
  2. 根据配置生成共识。现阶段支持CRFD共识。
  3. 共识模块初始化。
  4. 开始共识。
  5. 接到共识初始化完成消息。并将结果反馈至ModuleManager。

8) CRFD共识执行

a)接收共识初始化的请求。开始对共识模块进行初始化。 b)初始化各共识模块

  • 预执行模块
  • 块模块
  • 背书模块
  • 投票模块
  • 合约容器

c)接收块节点初始化完成消息(暂时,默认为共识均初始化完成)。发送到ConsensusManager。

9) 合约容器启动

a)接收交易,进行交易的执行。并返回交易执行结果。

10) 块模块启动

a)订阅背书块、新块。 b)接收投票节点发送的创建新块的请求,按需打包交易生成预备块,发给预执行模块进行预执行(该节点为出块人)。 c)接收投票节点发送的创建新块的通知(该节点为非出块人)。 d)接收预执行结果,确认成功后广播该背书块。 e)接收各个背书节点反馈的。确认成功后(满足背书条件),向块模块发送新块请求。 f)接收新块请求,广播块。新块入网。 g)接收新块。确认正确后将其发送至存储节点。同时向投票模块发送下一轮投票请求。 h)接收创世块创建请求。打包创世块,提交块到预执行模块。 i)接收创世块预执行结果。确认正确后提交至存储模块。同时向投票模块发送下一轮投票请求。 j)接收同步结果。根据不同情况进行处理

  • 创世块创建。
  • 进行下一次出块请求,即新的投票(发送至投票模块)。

k)出块超时

  • 出块成功,不处理。
  • 失败,触发下一次。

11) 背书模块启动

a)接收背书块,按配置进行背书 读写集检查,反馈背书结果。 完整交易检查(交易预执行结果),反馈背书结果(未实现,马上完善) a)执行预执行。 b)接收预执行结果,反馈。

12) 投票模块启动。

该模块是非常核心的模块。后续会继续完善。

  1. 接收下一轮投票消息。进行投票条件检测,满足条件。则发送出块触发消息(向自身)。

  2. 接收出块触发消息,进行候选人和出块人的选举。

    • 如果选举不成功(条件不满足),空闲等待
    • 成功,将结果反馈至块模块
  1. 该点为出块人。出块请求

  2. 该点为非出块人。出块通知

  3. 接收种子节点消息。将种子节点缓存。

  4. 接收回复投票消息。向自身发送重新检查投票条件的请求。将投票状态从将空闲等待状态恢复。

  5. 接收投票条件重新检查的消息,检查投票条件

    • 满足,进行投票(b),结果反馈
    • 不满足,继续等待

13) 预执行模块

  1. 接收预执行块,向合约提交需要预执行的交易。

  2. 接收各个交易的预执行结果。满足预执行结果的整合条件(全部反馈),将预执行结果反馈至预执行提交者。(这里,注意整合交易时确保交易是按照原序)。

  3. 预执行超时

    • 成功
    • 失败,反馈

其中,共识涉及到的详细算法,请详见共识算法的相关文件。